简书链接:SDK研发录AndroidStudioEclipse通用工程构建以及遇到的坑解决
文章字数:788,阅读全文大约需要3分钟
什么叫通用工程,我发布的sdk里面只有一个 同样的jar文件,一个so,而不是给eclipse一个 android studio,这两个开发软件都可以打开这个文件夹,这样demo和sdk 库可以省不少体积。
对于只用eclipse的开发者同样可以打开。

我是喜欢as的,但是客户不跟时代,没办法,我必须得发布eclipse的demo,发arr特么不行,我们公司太惯这群人了,。
Build.gradle内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
apply plugin: 'com.android.application'

android {
compileSdkVersion 19
buildToolsVersion "27.0.3"

defaultConfig {
applicationId "cn.qssq666.demo"
minSdkVersion 14
targetSdkVersion 21
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}

sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']

resources.srcDirs = ['src']
aidl.srcDirs = ['src']
res.srcDirs = ['res']
jniLibs.srcDirs=['libs']
assets.srcDirs = ['assets']
}
}


}

dependencies {
api files('libs/fastjson-1.2.7.jar')
implementation files('libs/xxx.jar')
}

eclipse文件内容

引入libs

未完待续
project.properties

1
2
3
4
target=android-23
android.library.reference.1=../../sdk/xxxx
//或者
android.library=true

local.properties

1
2
3
ndk.dir=D\:\\env\\android_sdk\\ndk-bundle
sdk.dir=D\:\\env\\android_sdk

.classpath

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="lib" path="libs/fastjson-1.2.7.jar"/>


<classpathentry kind="lib" path="libs/org.apache.http.legacy.jar"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>

.project

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>项目名称</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

eclipse 清单文件可能需要的默认值
这个东西在android studio已经是通过build.gradle来弄了,但是这东西没有,

1
2
3
<uses-sdk
android:minSdkVersion="12"
android:targetSdkVersion="25" />

别名的效果
image.png
从上图可以看出来localtion是app,但是显示的名字是自定义的。
那么项目整体目录是如下这样的.
image.png

image.png

版本定义

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mydemo"
android:versionCode="1"
android:versionName="1.0">

<uses-sdk
android:minSdkVersion="12"
android:targetSdkVersion="25" />

最后就是res文件夹不能为空,另外eclipse的library不识别资产目录只能看到demo工程。
最后贡献发布sdk的gradle脚本,目前有一个疑问就是 执行删除文件然后立马执行复制会出现失败的情况,目前无法得知原因。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
import java.text.SimpleDateFormat

apply plugin: 'com.android.library'

def publishDir = 'D:/luozheng/gradle_sdk/checkAndProtocolPublish1'
def jniDir = "${project.rootDir}/mergeincludearr/build\\intermediates\\jniLibs\\release"
def arrDir = "${project.rootDir}/mergeincludearr/build/outputs/aar/mergeincludearr-release.aar"
def jarDir = "${project.rootDir}/mergeincludearr/build\\intermediates\\intermediate-jars\\release/classes.jar"

android {
compileSdkVersion 28
buildToolsVersion "28.0.3"


defaultConfig {
minSdkVersion 14
targetSdkVersion 28
versionCode 1
versionName "1.0"


}

android {
lintOptions {
abortOnError false
}
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
aidl.srcDirs = ['src']
def temp = ['envcheck/java', 'simulator/java']
if (BAIHE_SDK) {
temp.add('proxyencryptsms/java')
} else {
temp.add('proxyencrypt/java')
}
java.srcDirs = temp
temp = ['envcheck/libs', 'simulator/libs']
if (BAIHE_SDK) {
temp.add('proxyencryptsms/libs')
} else {
temp.add('proxyencrypt/libs')
}
jniLibs.srcDirs = temp
temp = ['envcheck/res', 'simulator/res']
if (BAIHE_SDK) {
temp.add('proxyencryptsms/res')
} else {
temp.add('proxyencrypt/res')
}
res.srcDirs = temp
assets.srcDirs = ['assets']
}
}
buildTypes {
release {
buildConfigField "boolean", "LOG_MODE", "false"
minifyEnabled true

proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
buildConfigField "boolean", "LOG_MODE", "true"
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}

}

//type: org.gradle.api.tasks.Copy
task copyCacheClass(group: "自定义任务") {
//D:\luozheng\checkAndProtocolFix\mergeincludearr\build\intermediates\classes\release


doFirst {

if (!BAIHE_SDK) {

copy {

from('cacheclass')
into("build/intermediates/classes/release")


}
copy {
from('cacheclass')
into("build/intermediates/classes/debug")

}

print "复制缓存文件\n"
}


}
}

//D:\luozheng\checkAndProtocolFix\mergeincludearr\build\intermediates\intermediate-jars\release


def deleteCache = false;
//dependsOn: build
task 更新当前SDK到生产SDK目录(group: "自定义任务", dependsOn: build) {

def sdkjarlib = "${publishDir}/sdkjar/libs"
def sdkarrlib = "${publishDir}/sdkarr/libs"



doLast {
//清空存档。

print "arrdir ${arrDir} \n"
print "jarDir ${jarDir} \n"
print "jniDir ${jniDir} \n"

if (!new File(sdkarrlib).exists()) {
new File(sdkarrlib).mkdirs();
print "sdk arr 不存在 "
}
if (!new File("${publishDir}/sdkjar/res").exists()) {//eclipse 报错
new File("${publishDir}/sdkjar/res").mkdirs();
print "sdk arr 不存在 "
}


if (!new File(sdkjarlib).exists()) {
print "sdk jar 不存在 "
new File(sdkjarlib).mkdirs();
} else {
print "sdk jar 存在 "
}
//-------------------------------------------
print " sdk arr do \n"

copy {//不根据根目录定位,容易找不到路径
from(arrDir)
into(sdkarrlib)
rename { "peoplesdk.aar" }
}
print "self sdk arr do \n"
copy {
from(arrDir)
into("${project.rootDir}/sdkarr/libs")
rename { "peoplesdk.aar" }
}

//-------------------------------------------
print "demo source do \n"
copy {

from("${project.rootDir}/app/")
into("${publishDir}/app/")
exclude {

details ->
details.file.name.equals("build") || details.file.name.endsWith(".iml") || details.file.name.endsWith(".class")

}
}
//-------------------------------------------
print " sdk jar do \n"
}
print "self sdk jar do \n"
copy {
from(jarDir)
into("${project.rootDir}/sdkjar/libs")
rename { "peoplesdk.jar" }
}
copy {//复制jni
from(jniDir)
into("${project.rootDir}/sdkjar/libs")
}


copy {

from("${project.rootDir}/sdkjar/")
into("${publishDir}/sdkjar/")
exclude {
details ->
details.file.name.equals("build") || details.file.name.endsWith(".iml") || details.file.name.endsWith(".class")

}
}


}
task 打包SDK生成压缩包(type: Zip, group: "自定义任务") {

print "扫描压缩"
def date = new SimpleDateFormat("yyyy-MM-dd-HHmm").format(new Date());
print "执行压缩任务!"
from("${publishDir}")
archiveName "爱加密加密解密与环境检测sdk_${android.defaultConfig.versionName}_${date}.zip"
destinationDir = file("../out/")
exclude {


details ->
details.file.name.equals(".gradle") || details.file.name.equals("bin") || details.file.name.equals(".idea") || details.file.name.equals("gen") || details.file.name.equals("build") || details.file.name.endsWith(".iml") || details.file.name.endsWith(".class") || details.file.name.endsWith(".bak")

}
doFirst {
print "执行压缩任务的doLast执行"
}

}

task 清除生成SDK目录的build文件(group: "自定义任务") {

doFirst {
print "\n删除SDK目录垃圾文件"

delete("${publishDir}/.idea")
delete("${publishDir}/checkAndProtocolPublish.iml")
delete("${publishDir}/.gradle")
delete("${publishDir}/app/build")
delete("${publishDir}/app/bin")
delete("${publishDir}/app/gen")
delete("${publishDir}/app/app.iml")
delete("${publishDir}/.gradle")
delete("${publishDir}/sdkjar/build")
delete("${publishDir}/sdkjar/gen")
delete("${publishDir}/sdkjar/bin")
delete("${publishDir}/sdkarr/build")
delete("${publishDir}/sdklib/sdklib.iml")
delete("${publishDir}/sdkarr/sdklib.iml")
}

}

task 清空文件以便重新拷贝(group: "自定义任务") {

doFirst {
print "\n删除SDK目录垃圾文件"
delete("${project.rootDir}/sdkjar/libs")
delete("${project.rootDir}/sdkjar/res")
delete("${project.rootDir}/sdkjar/src")
delete("${publishDir}/sdkjar/libs")
delete("${publishDir}/sdkjar/res")
delete("${publishDir}/app/src")
delete("${publishDir}/app/res")
}

}

build.dependsOn(copyCacheClass)//通过执行copyFile任务触发 cooyFile在 build之后执行,无法拦截 arr的生成。

dependencies {
compile fileTree(dir: 'envcheck/libs', include: ['*.jar'])
compile fileTree(dir: 'proxyencrypt/libs', include: ['*.jar'])
compile fileTree(dir: 'libs', include: ['*.jar'])


}

image.png

eclipse开发apk最经常出现的坑就是签名不一致

这种情况只能寻找apk卸载,错误一般是提示看日志,但是压根看不懂日志的。